home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-01
/
tc_tsr10.zip
/
TSR_LIST.TXT
< prev
next >
Wrap
Text File
|
1991-06-18
|
7KB
|
167 lines
TSR_LIST.TXT
Here is some documentation I wrote some time ago. Hope it's useful, but,
The author shall not be liable to the user for any direct, indirect or
consequential loss arising from the use of, or inability to use, any
program or file howsoever caused. No warranty is given that the programs
will work under all circumstances.
Sherif
/*--------------------------------------------------------------------------*
| Sherif El-Kassas . :. |
| EB dept \_____o__/ __________ |
| Eindhoven U of Tec .. / |
| The Netherlands / Email: elkassas@eb.ele.tue.nl |
*--------------------------------------------------------------------------*/
TSR LIST
Sherif El-Kassas
February 1989
Memory resident utilities are among the most popular applications used on
MS-DOS based machines.
However, not all implementations of TSR (Terminate but Stay Resident) programs
are completely safe to use. Loading some TSRs in the wrong sequence can result
in a system crash, which means you will have to reboot, thus loosing any data
stored in RAM. Even with the most robust TSRs, attempting to uninstall memory
resident applications in the wrong sequence will leave your system in a
unpredictable (messy) state.
[
For example try the following:
C> LIGHT (load Turbo Lightening)
C> SK (load SideKick)
C> LIGHT /K (uninstall Turbo Lightening)
Now try activating SideKick (by pressing it's hot-key), or even reloading a
new copy of SideKick into RAM. You will find that SideKick detects that it's
already loaded, and therefor refuses to reload, on the other hand it dos not
respond to the hot-key !. Obviously any unsaved data in SideKick's notepad is
lost.
]
So it's helpful to know which TSRs are currently loaded, the sequence of
loading, and which interrupt vectors are used by them, before
loading/unloading a TSR.
TSR_LIST is a utility - written in Turbo C - that prints a list of programs
that are currently loaded in your PC's memory. It also prints a list of the
interrupt vectors used (disabled) by each program.
PREPARING TSR_LIST
After you type the C source code (i.e. TSR_LIST.C) compile it using the
following commands:
C> TCC TSR_LIST
Then to run the program simply type TSR_LIST and press enter.
HOW TSR_LIST WORKS
TSR_LIST performs three main tasks:
o Finding the resident program;
o Locating and printing it's name (it's not always possible); and
o Printing the used interrupt vectors.
FINDING THE RESIDENT PROGRAM
MS-DOS divides memory into a group of blocks, each block is preceded with a 16
byte header called a memory control block (also called an arena header). A MCB
(Memory Control Block) contains three important fields:
o A byte indicating whether this MCB is/isn't the last MCB in the chain
('M' -> part of the chain, 'Z' -> end of the chain);
o A word indicating the owner of the block (the owner's PSP address); and
o A word indicating the size of the block in paragraphs.
When MS-DOS loads a program into memory, it allocates two memory blocks for
it. The first is for the program's environment space, and the second is for
the program itself. The owner fields in the two MCBs point to the program's
PSP (i.e. a program's MCB owns its self). Therefore finding a resident program
means scanning all valid MCBs until we find a MCB that owns its self.
LOCATING AND PRINTING THE PROGRAM'S NAME
The program's environment block contain a series of ASCIIZ strings (an ASCIIZ
string is a null terminated character string). The end of the set of strings
is indicated by an additional null character. Under MS-DOS versions 3.0 and
higher, two additional fields are added to the environment block. The first is
a word count field, and the second is the full path and name of the program.
The address of the environment block is kept at offset 0x2C of the program's
PSP.
PRINTING THE USED INTERRUPT VECTORS
The first 1K bytes of RAM are called the interrupt vector table. Each entry in
the table is 4 bytes long, and contains the segment and offset of the
interrupt service routine (00 to 0xFF). So finding the used interrupts means
scanning the interrupt table for an address that lies in the range occupied by
the resident program.
So TSR_LIST scans the chain of MCBs, whenever it finds a program (a block that
owns its self) it first gets the program's name from it's environment space,
and then scans the interrupt vector table (at 0:0) to find the used
interrupts.
PSP Environment Segment
00 +-----------------------+ +-------------------+
: | | +--->|VAR1=STRING <null> |
2C +-----------------------| | |VAR2=STRING <null> |
|Environment Segment +----+ |: |
2E +-----------------------| |: |
: | | |VARn=STRING <null> |
: +-----------------------| |<null> <num words> |
: | | |PROGRAM NAME <null>|
FF +-----------------------+ | |
+-------------------+
FIG.1 RELEVANT PARTS PSP AND ENVIRONMENT SPACE STRUCTURE
PSP (program name is c:\utils\sk\sk.com)
cs:0000 CD 20 00 A0 00 9A F0 FE 1D F0 60 03 83 59 2D 03 M .p~ p` Y-
cs:0010 83 59 2F 02 B2 5E C5 44 01 01 01 0 +--+--+ F FF .Y/ 2^+D ...
cs:0020 FF FF FF FF FF FF FF FF FF FF FF F |86|83| 0 B1 ................
: +--+--+
: |
cs:00F0 0A 90 F0 B3 00 00 14 B3 18 00 DA 5B 0A|90 20 B3 .p| .| +[. |
|
Dump of Environment Space |
+---------------------------------------------+
+--+-+
|8386:0000 43 4F 4D 53 50 45 43 3D 43 3A 5C 43 4F 4D 4D 41 COMSPEC=C:\COMMA
+----+0010 4E 44 2E 43 4F 4D 00 50 41 54 48 3D 43 3A 5C 44 ND.COM PATH=C:\D
8386:0020 4F 53 00 50 52 4F 4D 50 54 3D 24 50 24 4 |00|00| OS PROMPT=$P$G
8386:0030|01|00|43 3A 5C 55 54 49 4C 53 5C 53 4B 5 +--+--+| C:\UTILS\SK\SK |
8386:004 +--+--+ F 4D 00 | |.COM |
| +-----------+ +-------+---------+
| | |
Number of words field Two zero bytes indicating Program name
end of environment variables
FIG.2 ACTUAL DUMP OF PSP AND ENVIRONMENT SPACE
REFERENCES
1. Ray Duncan, "Advanced MS-DOS", MicroSoft press 1986.
2. Robert L. Hummel, "A Memory Mapping Utility", PC Magazine, August 1987.
3. Jeff Prosise, "Instant Access To Directories", PC Magazine, April 1987.